package com.example.demo.util;

import com.example.demo.domain.base.TreeNode;
import org.apache.commons.collections4.CollectionUtils;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * TreeUtils
 *
 * @author haochen78
 * @date 2025/10/7 21:43
 **/
public class TreeUtils {

    /**
     * 根据父ID构建树形结构
     *
     * @param allNodes     所有节点的扁平列表
     * @param rootParentId 根节点的父ID（通常为 null, 0 或 -1）
     * @param <T>          节点类型，需实现 TreeNode 接口
     * @return 构建好的树形结构列表（森林）
     */
    public static <T extends TreeNode<T>> List<T> buildTree(List<T> allNodes, Long rootParentId) {
        if (CollectionUtils.isEmpty(allNodes)) {
            return Collections.emptyList();
        }

        // 使用 Map 存储所有节点，便于快速查找
        Map<Long, T> nodeMap = new HashMap<>();
        for (T node : allNodes) {
            nodeMap.put(node.getId(), node);
        }

        List<T> rootNodes = new ArrayList<>();

        // 遍历所有节点，建立父子关系
        for (T node : allNodes) {
            Long parentId = node.getParentId();

            // 判断是否为根节点
            if (parentId == null || parentId.equals(rootParentId)) {
                rootNodes.add(node);
            } else {
                // 查找父节点
                T parentNode = nodeMap.get(parentId);
                if (parentNode != null) {
                    if (parentNode.getChildren() == null) {
                        parentNode.setChildren(new ArrayList<>());
                    }
                    // 将当前节点添加到父节点的子节点列表中
                    parentNode.getChildren().add(node);
                }
                // 如果父节点不存在，可以记录日志或忽略
            }
        }

        return rootNodes;
    }

}
